// type 和 interface 的区别？？？
// type和interface的相同点：都是用来定义对象或函数的形状。

// type可以定义 基本类型的别名，如 type myString = string

// type可以通过 typeof 操作符来定义，如 type myType = typeof someObj

// type可以申明 联合类型，如 type unionType = myType1 | myType2

// type可以申明 元组类型，如 type yuanzu = [myType1, myType2]

// interface可以 声明合并，这种情况下，如果是type的话，就会报 重复定义 的警告，因此是无法实现 声明合并 的。

// 对象:通过 接口/type 定义类型  不能使用大小写Object定义
// type 关键字: 自定义新类型，当ts内置类型满足不了需求的时候，自定义类型。
type User = {
  motto: string; // 必选属性;只要是属于User类型的值，必须设置这个属性
  uage: number; // 必选属性;只要是属于User类型的值，必须设置这个属性
  usex?: boolean; // 可选属性；只要是属于User类型的值，可以设置，也可以不设置
};

let user: User = {
  motto: "今日事今日毕",
  uage: 18,
};
console.log(user);
console.log(user.motto);
console.log(user.uage);

// 支持任意类型的对象类型
// [propName:string | number]  这个是约定键的类型， string | number 联合类型，
// 规定键的类型。 any是值得类型
type UserType = {
  [key: string | number]: any;
};
let user1: UserType = {
  motto: "今日事今日毕",
  uage: 22,
  usex: true,
  class: [1, 2, 3, 4, 5],
  info: {
    address: "郑州",
    tel: 1234567890,
  },
};
console.log(user1);
console.log(user1.motto); //今日事今日毕
console.log(user1.class); //[1, 2, 3, 4, 5]
console.log(user1.info.address); // 郑州

// 通过接口定义对象类型
interface People {
  pname: string; // people类型的值，必须有pname属性
  [key: string | number]: any;
}
let p1: People = {
  pname: "100",
  a: 10,
  b: true,
  hobby: "写字",
};
console.log(p1.a); // 10
console.log(p1.hobby); //写字
